package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import model.Casilla;
import model.Rodillo;

public class AdmPersistenciaRodillo {
	private static final String  SELECT_RODILLOS="select * from tpinteractivas.casillas_rodillos_relacion rel ORDER BY Rodillo_Codigo,Rodillo_Posicion ";
	private static final String  SELECT_RODILLOS_COUNT="select count(*) from tpinteractivas.rodillos";
	private static final String DELETE_RODILLOS_CASILLAS="DELETE  FROM tpinteractivas.casillas_rodillos_relacion";
	private static final String DELETE_RODILLOS="DELETE  FROM tpinteractivas.rodillos";
	private static final String INSERT_RODILLO = "insert into tpinteractivas.rodillos (Codigo) values (?)";
	private static final String INSERT_RODILLO_RELACION = "insert into tpinteractivas.Casillas_Rodillos_Relacion (Casillas_Codigo, Rodillo_Codigo, Rodillo_Posicion) values (?, ?, ?)";
	
	
	private static AdmPersistenciaRodillo instancia;
	
	private AdmPersistenciaRodillo() {

	}

	public static synchronized AdmPersistenciaRodillo getInstancia() {
		if (instancia == null)
			instancia = new AdmPersistenciaRodillo();
		return instancia;
	}
	
	
	public List<Rodillo> selectRodillos() {
		List<Rodillo> rodillos=new ArrayList<Rodillo>();
		Set<Casilla> casillas = AdmPersistenciaCasilla.getInstancia().selectCasillas();
		Map<Integer,Casilla> casillasMap=makeCasillasMap(casillas);
		Connection con = PoolConnection.getPoolConnection().getConnection();
		try {
			Statement s = con.createStatement();
			ResultSet result = s.executeQuery(SELECT_RODILLOS);
			Integer nroRodillo=-1;
			Rodillo rodillo=null;
			while (result.next()) {
				if (nroRodillo!=-1 && nroRodillo!=result.getInt("Rodillo_Codigo")){
					//termino el rodillo lo agrego
					rodillos.add(rodillo);
					//creo el nuevo rodillo
					nroRodillo=result.getInt("Rodillo_Codigo");
					rodillo=new Rodillo(nroRodillo);
					rodillo.agregarCasilla(casillasMap.get(result.getInt("Casillas_Codigo")));
					//limpio los ids
				} else if (nroRodillo==result.getInt("Rodillo_Codigo")){
					//mismo rodillo, agrego la casilla
					rodillo.agregarCasilla(casillasMap.get(result.getInt("Casillas_Codigo")));
				}	else{
					//creo el primer rodillo
					nroRodillo=result.getInt("Rodillo_Codigo");
					rodillo=new Rodillo(nroRodillo);
					rodillo.agregarCasilla(casillasMap.get(result.getInt("Casillas_Codigo")));
				}
			}
			//Si no hago esto el ultimo rodillo me queda afuera
			if (nroRodillo!=-1){
				rodillos.add(rodillo);
			}
			
		
		} catch (Exception e) {
			System.out.println();
		}
		PoolConnection.getPoolConnection().realeaseConnection(con);
		return rodillos;
	}
	
	
	private Map<Integer,Casilla> makeCasillasMap(Set<Casilla> casillas) {
		Map result=new HashMap<Integer,Casilla>();
		for (Casilla casilla:casillas){
			result.put(casilla.getCodigo(), casilla);
		}
		return result;
	}

	public int getCantidadRodillos() {
		Connection con = PoolConnection.getPoolConnection().getConnection();
		int res = -1;
		try {

			Statement s = con.createStatement();
			ResultSet result = s.executeQuery(SELECT_RODILLOS_COUNT);
			if (result.next()) {
				res = result.getInt(1);
			}

		} catch (Exception e) {
			System.out.println();
		}
		PoolConnection.getPoolConnection().realeaseConnection(con);
		return res;
	}

	public boolean eliminarRodillos() {
		Connection con = PoolConnection.getPoolConnection().getConnection();
		boolean delete=false;
		try {
			Statement s = con.createStatement();
			delete = s.execute(DELETE_RODILLOS_CASILLAS);
			delete = s.execute(DELETE_RODILLOS);
	
			delete=true;
		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}
		PoolConnection.getPoolConnection().realeaseConnection(con);
		return delete;
	}
	
	public int insertarRodillo(Rodillo rodillo) {
		int nuevoRodilloId = this.getCantidadRodillos() + 1;
		rodillo.setPosicion(nuevoRodilloId);
		try {
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement(INSERT_RODILLO);
			// agregar campos
			s.setInt(1, nuevoRodilloId);
			s.execute();
			PoolConnection.getPoolConnection().realeaseConnection(con);
		} catch (Exception e) {
			System.out.println("Error insertando Rodillo");
			System.out.println(e.getMessage());
			return -1;
		}
		
		try {
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement(INSERT_RODILLO_RELACION);
			int i = 1;
			for (Casilla casilla : rodillo.getCasillas()) {
				s.setInt(1, casilla.getCodigo());
				s.setInt(2, nuevoRodilloId);
				s.setInt(3, i);
				System.out.println("Insertando Rodillo: Casilla " + casilla.getCodigo() + ", Rodillo: " + nuevoRodilloId + ", Posicion: " + i);
				s.execute();
				i++;
			}
			
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
		} catch (Exception e) {
			System.out.println("Error insertando Rodillo_Relacion");
			System.out.println(e.getMessage());
			return -1;
		}
		
		return nuevoRodilloId;
	}
	

	
}
